using System;
using System.Collections.Generic;
using TestCases.CompareAssert.Core.Interfaces;
using TestCases.CompareAssert.Matchers;
using TestCases.CompareAssert.Settings.Interfaces;

namespace TestCases.CompareAssert.Interfaces
{
    public interface ICustomizableAssertion: IDefaultAssertion
    {

        ICompareSetup ForContextMatch(IObjectMatcher<ICompareContext> matcher);
        
        ICompareSetup ForSpecificType<T>();
        ICompareSetup ForSpecificType(Type type);
        ICompareSetup ForSpecificTypes(IEnumerable<Type> types);        
        ICompareSetup ForInstanceOf<T>();
        ICompareSetup ForInstanceOf(Type type);
        ICompareSetup ForInstancesOf(IEnumerable<Type> types);        
        ICompareSetup ForTypeMatch(Predicate<Type> predicate);
        
        ICompareSetup ForSpecificPath(string path);
        ICompareSetup ForSpecificPaths(IEnumerable<string> types);
        ICompareSetup ForPathMatch(string regex);
        ICompareSetup ForPathMatch(Predicate<string> predicate);
        
        ICompareSetup ForSpecificValue(object value);
        ICompareSetup ForSpecificValues(IEnumerable<object> types);
        ICompareSetup ForValueMatch(Predicate<object> predicate);

        ICompareSetup Setup { get; }

        void Reset();
        
    }
}